home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC] / NeXTSTEP 3.3 Dev Intel.iso / NextDeveloper / Headers / kernserv / kern_server_types.h < prev    next >
Text File  |  1995-02-14  |  7KB  |  223 lines

  1. /* 
  2.  * Copyright (c) 1989 NeXT, Inc.
  3.  *
  4.  * HISTORY
  5.  * 8-Jun-92  Matthew Self (mself) at NeXT
  6.  *    Added mach_header field to kern_server_var_t for Objective-C.
  7.  *
  8.  * 12-Jul-90  Gregg Kellogg (gk) at NeXT
  9.  *    Changed msgs to msg, as only a single message is retained.
  10.  *    Added KS_VERSION(=2), which is updated whenever a protocol change
  11.  *    is made.
  12.  *
  13.  * 51-May-90  Gregg Kellogg (gk) at NeXT
  14.  *    Added pad filed at end of kern_server struct so that already compiled
  15.  *    servers won't be impacted when the kern_server grows.
  16.  *
  17.  * 04-Apr-89  Gregg Kellogg (gk) at NeXT
  18.  *    Created.
  19.  *
  20.  */
  21.  
  22. #ifndef    _KERN_SERVER_
  23. #define    _KERN_SERVER_
  24. #if    KERNEL
  25. #import <mach/mach_user_internal.h>
  26. #endif    KERNEL
  27. #import <mach/mach_interface.h>
  28. #import <mach/message.h>
  29. #import <sys/types.h>
  30. #import <kernserv/queue.h>
  31. #import <kernserv/kern_server_reply_types.h>
  32.  
  33. /*
  34.  * Messages to be sent to the Mach bootstrap port.  The bootstrap port
  35.  * is inherited from the parent task and is used for finding information
  36.  * about the external and internal environment.
  37.  *
  38.  * Generic things that need to be done to get a kernel server started:
  39.  *    Wire down memory regions
  40.  *    Associate ports with procedures (to handle messages)
  41.  */
  42.  
  43. /*
  44.  * This must be small enough to fit (along with a message header) in 8K.
  45.  */
  46. #define    KERN_SERVER_LOG_SIZE    500
  47.  
  48. #define KERN_SERVER_ERROR    100        // bad message
  49. #define KERN_SERVER_NOTLOGGING    101        // server not logging data
  50. #define KERN_SERVER_UNCREC_PORT    102        // port not recognized
  51. #define KERN_SERVER_BAD_VERSION    103        // server version not supported
  52.  
  53. #define KERN_SERVER_NPORTPROC    50
  54.  
  55. typedef boolean_t (*port_map_proc_t) (
  56.     msg_header_t *in_msg,
  57.     void *arg);
  58.  
  59. typedef boolean_t (*port_map_serv_t) (
  60.     msg_header_t *in_msg,
  61.     msg_header_t *out_msg);
  62.  
  63. typedef boolean_t (*port_death_proc_t)(port_name_t port);
  64. typedef boolean_t (*port_notify_proc_t)(port_name_t port, u_int notify_type);
  65.  
  66. typedef int (*call_proc_t)(int arg);
  67.  
  68. typedef struct port_proc_map {
  69.     port_name_t    port;        // port -> proc mapping
  70.     port_map_proc_t    proc;        // proc to call
  71.     void *        uarg;
  72.     enum { PP_handler, PP_server }
  73.             type;        // proc interface type
  74. } port_proc_map_t;
  75.  
  76. typedef struct {
  77.     port_t        reply_port;
  78.     port_name_t    req_port;
  79.     queue_chain_t    link;
  80. } ks_notify_t;
  81.  
  82. #if    KERNEL
  83. /*
  84.  * Supported compatibility level.
  85.  */
  86. #define    KS_COMPAT    2
  87. #define    KS_VERSION    2
  88.  
  89. /*
  90.  * Server instance structure
  91.  */
  92. typedef struct kern_server_var {
  93.     simple_lock_data_t    slock;        // access synchronization
  94.     port_name_t        local_port;    // local_port of cur message
  95.     port_name_t        task_port;    // my task port
  96.     thread_t        server_thread;    // server thread.
  97.     port_name_t        bootstrap_port;    // my bootstrap port
  98.     port_name_t        boot_listener_port; // port we listen on
  99.     port_name_t        log_port;    // port to send log info to
  100.     port_name_t        notify_port;    // notification port.
  101.     port_set_name_t        port_set;    // port set we receive on
  102.     log_t            log;        // log structure
  103.     queue_head_t        msg_callout_q;    // queue of messages to send
  104.     queue_head_t        msg_callout_fq;    // free queue
  105.     msg_header_t        *msg;        // msg we receive into
  106.     int            msg_size;    // size of msg.
  107.     struct msg_send_entry {
  108.         void        (*func)();
  109.         void *        arg;
  110.         queue_chain_t    link;
  111.     } msg_send_array[20];
  112.     port_proc_map_t        port_proc[KERN_SERVER_NPORTPROC];
  113.     port_name_t        last_unrec_port;// last bad kern_serv_disp()
  114.     port_name_t        last_rec_port;    // last good kern_serv_disp()
  115.     int            last_rec_index;    // index of last good k_s_d()
  116.     port_death_proc_t    pd_proc;    // port death procedure
  117.     port_notify_proc_t    pn_proc;    // port notify procedure
  118.     queue_head_t        notify_q;    // queue of notify/req pairs.
  119.     int            version;    // version of server.
  120.     port_t            kernel_port;    // kernel task port for server
  121.     struct mach_header    *mach_header;    // mach_header of server module
  122. } kern_server_var_t;
  123.  
  124. typedef kern_server_var_t *kern_server_t;
  125.  
  126. /*
  127.  * Structure access functions.
  128.  */
  129. port_t kern_serv_local_port(kern_server_t *ksp);
  130. port_t kern_serv_bootstrap_port(kern_server_t *ksp);
  131. port_t kern_serv_notify_port(kern_server_t *ksp);
  132. port_set_name_t kern_serv_port_set(kern_server_t *ksp);
  133.  
  134. /*
  135.  * Function prototypes.
  136.  */
  137. void kern_server_main(void);
  138. void kern_serv_port_gone(kern_server_t *ksp, port_name_t port);
  139.  
  140. /*
  141.  * Log functions.
  142.  */
  143. void kern_serv_log (            // log a message
  144.     kern_server_t    *ksp,        // kern_server instance vars
  145.     int        log_level,    // level to log at
  146.     char        *msg,        // what to log (followed by args)
  147.     int        arg1,
  148.     int        arg2,
  149.     int        arg3,
  150.     int        arg4,
  151.     int        arg5);
  152.  
  153. /*
  154.  * Alias for msg_send to ensure that messages are sent at ipl0 from the proper
  155.  * task.
  156.  */
  157. kern_return_t kern_serv_callout (
  158.     kern_server_t    *ksp,
  159.     void        (*proc)(void *arg),
  160.     void        *arg);
  161.  
  162. /*
  163.  * Kernel version of kern_serv_notify, doesn't contact kern_loader, uses
  164.  * internal port_request_notification facility.
  165.  */
  166. kern_return_t kern_serv_notify (
  167.     kern_server_t    *ksp,
  168.     port_t        reply_port,
  169.     port_t        req_port);
  170.  
  171. /*
  172.  * Kernel reference for kern_serv interface routines.
  173.  */
  174. kern_return_t kern_serv_instance_loc (
  175.     void        *arg,        // (kern_server_t *ksp)
  176.     vm_address_t    instance_loc);
  177. kern_return_t kern_serv_boot_port (    // how to talk to loader
  178.     void        *arg,        // (kern_server_t *ksp)
  179.     port_t        boot_port);
  180. kern_return_t kern_serv_version (
  181.     void        *arg,        // (kern_server_t *ksp)
  182.     int        version);    // server version
  183. kern_return_t kern_serv_load_objc (
  184.     void        *arg,        // (kern_server_t *ksp)
  185.     vm_address_t    header);    // header addr
  186. kern_return_t kern_serv_wire_range (    // wire the specified range or memory
  187.     void        *arg,        // (kern_server_t *ksp)
  188.     vm_address_t    addr,
  189.     vm_size_t    size);
  190. kern_return_t kern_serv_unwire_range (    // unwire the specified range or memory
  191.     void        *arg,        // (kern_server_t *ksp)
  192.     vm_address_t    addr,
  193.     vm_size_t    size);
  194. kern_return_t kern_serv_port_proc (    // map a message on port to proc/arg
  195.     void        *arg,        // (kern_server_t *ksp)
  196.     port_all_t    port,        // port to map (all rights passed)
  197.     port_map_proc_t    proc,        // proc to call
  198.     int        uarg);        // replace local_port with uarg
  199. kern_return_t kern_serv_port_death_proc ( // specify port death handler
  200.     void            *arg,    // (kern_server_t *ksp)
  201.     port_death_proc_t    proc);    // proc to call
  202. kern_return_t kern_serv_call_proc (    // call procedure with argument
  203.     void        *arg,        // (kern_server_t *ksp)
  204.     call_proc_t    proc,        // proc to call
  205.     int        uarg);        // arg to supply
  206. kern_return_t kern_serv_shutdown (
  207.     void        *arg);        // (kern_server_t *ksp)
  208. kern_return_t kern_serv_log_level (
  209.     void        *arg,        // (kern_server_t *ksp)
  210.     int        log_level);
  211. kern_return_t kern_serv_get_log (
  212.     void        *arg,        // (kern_server_t *ksp)
  213.     port_t        reply_port);    // port to send log information to
  214. kern_return_t kern_serv_port_serv (    // map a message on port to proc/arg
  215.     void        *arg,        // (kern_server_t *ksp)
  216.     port_all_t    port,        // port to map (all rights passed)
  217.     port_map_proc_t    proc,        // proc to call
  218.     int        uarg);        // replace local_port with uarg
  219. port_t kern_serv_kernel_task_port(void);    // kernel port (for vm ops).
  220.  
  221. #endif    KERNEL
  222. #endif    _KERN_SERVER_
  223.